<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        /* 在创建对象时很多的属性和方法是相同的,所以可以用函数的方法把创建对象的方法封装起来，称为构造函数
        构造函数就是把对象里面一些相同的属性和方法封装到函数里面
        构造函数可以理解为某一类对象的集合 */

        /* 1.构造函数首字母大写
        2.构造函数不需要return
        3.构造函数需要new */


        function Star(uname, uage, usex) {
            this.name = uname,
                this.age = uage,
                this.sex = usex;
            this.sing = function (sang) {
                console.log(sang);
            }
        }
        var ldh = new Star('刘德华', 19, '男');
        console.log(ldh.name);
        console.log(ldh['age']);
        console.log(typeof ldh);
        ldh.sing('冰雨');
        // 这是用构造函数创建对象的方法
        var zxy = new Star('张学友', 20, '男')
        console.log(zxy);
        zxy.sing('啦啦啦啦')
        // 有了构造函数在创建相同类型的对象时就会方便很多


        function Legends(uname, type, hp) {
            this.name = uname,
                this.type = type,
                this.hp = hp,
                this.attack = function (b) {
                    console.log(b);
                }
        }
        var lianpo = new Legends('廉颇', '力量型', 500)
        console.log(lianpo);
        lianpo.attack('近战');

        var houyi = new Legends('后羿', '射手型', 100)
        console.log(houyi);
        console.log(houyi.hp);
        houyi.attack('远程');

        // 构造函数是某一大类，对象是一个实例


        /* new关键字执行的四个步骤:
        1.在内存中创建一个新的空对象
        2.让this指向这个新对象
        3.执行构造函数里面的代码，给这个对象添加属性和方法
        4.返回这个新对象（所以构造函数里不需要return） */
    </script>
</head>

<body>

</body>

</html>